package cc.comac.mom.datahandlers.entity;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.bean.EquipParam;
import cc.comac.mom.dao.entity.EquipParamDao;
import cc.comac.mom.entity.EquipParamEntity;
import cc.comac.mom.entity.EquipParamItemEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
import cc.comac.mom.util.GetGeneralFieldValue;

@Component
@Transactional
public class EquipParamDataHandler extends ServiceImpl<EquipParamDao, EquipParamEntity> {
	@Autowired
	private EquipParamDao equipParamDao;
	@Autowired
	private EquipParamItemDataHandler equipParamItemDataHandler;
	@Autowired
	private BaseEntityDataUtil baseEntityDataUtil;
	/**
	 * 新增参数组
	 * 
	 * @param equipParam
	 * @return 受影响行数
	 */
	public int insert(EquipParam equipParam) {
		Map<String, Object> map = new HashMap<String, Object>();
		// 校验参数组编码是否重复
		map.put("row_status", 1);
		map.put("param_name", equipParam.getParamName());
		List<EquipParamEntity> selectByName = equipParamDao.selectByMap(map);
		if (selectByName!=null && selectByName.size() > 0) {
			throw new RuntimeException("参数编码:" + equipParam.getParamName() + "已存在！");
		}
		// 校验参数组名称是否重复
		map.clear();
		map.put("param_value", equipParam.getParamValue());
		List<EquipParamEntity> selectByNumber = equipParamDao.selectByMap(map);
		if (selectByNumber!=null && selectByNumber.size() > 0) {
			throw new RuntimeException("参数名称:" + equipParam.getParamValue() + "已存在！");
		}
		// 保存数据
		baseEntityDataUtil.setBaseEntityData(equipParam);
		Integer insert = equipParamDao.insert((EquipParamEntity) equipParam);
		return insert;
	}

	/**
	 * 修改参数组
	 * 
	 * @param equipParam
	 * @return 受影响行数
	 */
	public int update(EquipParam equipParam) {
		Map<String, Object> map = new HashMap<String, Object>();
		// 校验参数组编码是否重复
		map.put("row_status", 1);
		map.put("param_name", equipParam.getParamName());
		List<EquipParamEntity> selectByName = equipParamDao.selectByMap(map);
		if (selectByName!=null && selectByName.size() > 0 && equipParam.getId()!=selectByName.get(0).getId()) {
			throw new RuntimeException("参数编码:" + equipParam.getParamName() + "已存在！");
		}
		// 校验参数组名称是否重复
		map.clear();
		map.put("param_value", equipParam.getParamValue());
		List<EquipParamEntity> selectByNumber = equipParamDao.selectByMap(map);
		if (selectByNumber!=null && selectByNumber.size() > 0 && equipParam.getId()!=selectByNumber.get(0).getId()) {
			throw new RuntimeException("参数名称:" + equipParam.getParamValue() + "已存在！");
		}
		// 更新数据
		equipParam.setLastModifiedTime(LocalDateTime.now());
		equipParam.setLastModifier(GetGeneralFieldValue.getCurrentUser());
		Integer updateById = equipParamDao.updateById(((EquipParamEntity) equipParam));
		return updateById;
	}

	/**
	 * 批量删除
	 * 
	 * @param equipParamList
	 * @return
	 */
	public int batchDelete(List<EquipParam> equipParamList) {
		List<EquipParamEntity> list = new ArrayList<EquipParamEntity>();
		// 预留删除校验
		for (EquipParam equipParam : equipParamList) {
			List<EquipParamItemEntity> selectAllByParamId = equipParamItemDataHandler.selectAllByParamName(equipParam.getParamName());
			if(selectAllByParamId!=null && selectAllByParamId.size()>0) {
				throw new RuntimeException("参数:" + equipParam.getParamName() + "存在参数项，不允许删除！");
			}
			EquipParamEntity equipParamEntity = new EquipParamEntity();
			equipParamEntity.setId(equipParam.getId());
			equipParamEntity.setRowStatus(0);
			equipParamEntity.setLastModifiedTime(GetGeneralFieldValue.getLocalDateTime());
			equipParamEntity.setLastModifier(GetGeneralFieldValue.getCurrentUser());
			list.add(equipParamEntity);
		}
		// 批量更新数据
		boolean updateBatchById = updateBatchById(list);
		return updateBatchById ? 1 : 0;
	}

	/**
	 * 分页查询
	 * 
	 * @param equipDevType
	 * @return
	 */
	public EquipParam selectAllByPage(EquipParam equipParam) {
		EquipParam returnEquipParam = new EquipParam();
		if(equipParam.getPageNum()==null || equipParam.getPageNum()==0) {
			equipParam.setPageNum(1);
		}
		if(equipParam.getPageSize()==null || equipParam.getPageSize()==0) {
			equipParam.setPageSize(10);
		}
		QueryWrapper<EquipParamEntity> queryWrapper = new QueryWrapper<EquipParamEntity>();
		queryWrapper.eq("row_status", 1);
		//不返回总记录数 设置false
		Page<EquipParamEntity> page = new Page<>(equipParam.getPageNum(), equipParam.getPageSize(), true);
		IPage<EquipParamEntity> iPage = equipParamDao.selectPage(page, queryWrapper);
		System.out.println("总页数:" + iPage.getPages());
		System.out.println("总记录数:" + iPage.getTotal());
		List<EquipParamEntity> records = iPage.getRecords();
		returnEquipParam.setPageNum(equipParam.getPageNum());
		returnEquipParam.setPageSize(equipParam.getPageSize());
		returnEquipParam.setEntityList(records);
		returnEquipParam.setTotalQuantity((int) iPage.getTotal());
		returnEquipParam.setPageCount((int) iPage.getPages());
		return returnEquipParam;
	}
	
	public List<EquipParamEntity> selectAll() {
		QueryWrapper<EquipParamEntity> queryWrapper = new QueryWrapper<EquipParamEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.orderBy(true, true, "param_number");
		List<EquipParamEntity> paramList = equipParamDao.selectList(queryWrapper);
		return paramList;
	}
	/**
	 * 批量更新
	 * @param entityList
	 * @return
	 */
	@Override
	public boolean updateBatchById(Collection<EquipParamEntity> entityList) {
		return super.updateBatchById(entityList);
	}
}
